﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using vHCS.HR.Entities;
using Core.Message.Entities;
using Core.Controls.Message;
using Core.ExceptionHandling;
using System.Collections;

namespace vHCS.Web.MdlHR.Controls
{
    /// <summary>
    /// HungDV
    /// </summary>
    public partial class HR_ctrSurvey : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
           
        }

        #region Property
        /// <summary>
        /// Nhóm validate
        /// </summary>
        public string ValidationGroup
        {
            get
            {
                return this.hdfValidationGroup.Value;
            }
            set
            {
                this.hdfValidationGroup.Value = value;

            }
        }
        /// <summary>
        /// Tên cột chứa Id của cha
        /// </summary>
        public string DataFieldParentID
        {
            get { return this.hdfDataFieldParentID.Value; }
            set { this.hdfDataFieldParentID.Value = value; }
        }
        /// <summary>
        /// Tên cột tên câu hỏi, trả lời
        /// </summary>
        public string DataFieldText
        {
            get { return this.hdfDataFieldText.Value; }
            set { this.hdfDataFieldText.Value = value; }
        }
        /// <summary>
        /// Tên cột QuestionId
        /// </summary>
        public string DataFieldQuestionId
        {
            get { return this.hdfDataFieldValue.Value; }
            set { this.hdfDataFieldValue.Value = value; }
        }

        /// <summary>
        /// Tên cột mã câu trả lời
        /// </summary>
        public string DataFieldAnswerId
        {
            get { return this.hdfAnswerId.Value; }
            set { this.hdfAnswerId.Value = value; }
        }

        /// <summary>
        /// Tên cột loại chọn câu trả lời
        /// </summary>
        public string DataFieldSelectType
        {
            get { return this.hdfDataFieldSelectType.Value; }
            set { this.hdfDataFieldSelectType.Value = value; }
        }
        /// <summary>
        /// Tên cột loại input
        /// </summary>
        public string DataFieldInputType
        {
            get { return this.hdfDataFieldInputType.Value; }
            set { this.hdfDataFieldInputType.Value = value; }
        }
        /// <summary>
        /// Tên cột bắt buộc trả lời câu hỏi
        /// </summary>
        public string DataFieldRequire
        {
            get { return this.hdfDataFieldRequire.Value; }
            set { this.hdfDataFieldRequire.Value = value; }
        }
        /// <summary>
        /// Tên cột chủ đề
        /// </summary>
        public string DataFieldTopicName
        {
            get { return this.hdfDataTextFieldTopic.Value; }
            set { this.hdfDataTextFieldTopic.Value = value; }
        }

        /// <summary>
        /// Tên cột chủ đề Id
        /// </summary>
        public string DataFieldTopicId
        {
            get { return this.hdfDataFieldTopicId.Value; }
            set { this.hdfDataFieldTopicId.Value = value; }
        }

        /// <summary>
        /// Tên cột comment, câu trả lời khác
        /// </summary>
        public string DataFieldComment
        {
            get { return this.hdfComment.Value; }
            set { this.hdfComment.Value = value; }
        }
        /// <summary>
        /// Tên cột comment, câu trả lời khác
        /// </summary>
        public string DataFieldAnswers
        {
            get { return this.hdfAnswers.Value; }
            set { this.hdfAnswers.Value = value; }
        }
        #endregion

        /// <summary>
        /// Load theo table
        /// </summary>
        public DataTable DataSource
        {
            set
            {
                
                ///Kiểm tra các trường bắt buộc Dev phải khai báo
                ///Các lỗi này được coi là compile error --> throw trực tiếp cho dev biết
                if (string.IsNullOrEmpty(this.DataFieldParentID))
                    throw new NoNullAllowedException(this.DataFieldParentID);
                else if (string.IsNullOrEmpty(this.DataFieldText))
                    throw new NoNullAllowedException(this.DataFieldText);
                else if (string.IsNullOrEmpty(this.DataFieldQuestionId))
                    throw new NoNullAllowedException(this.DataFieldQuestionId);
                else if (string.IsNullOrEmpty(this.DataFieldAnswerId))
                    throw new NoNullAllowedException(this.DataFieldAnswerId);
                else if (string.IsNullOrEmpty(this.DataFieldSelectType))
                    throw new NoNullAllowedException(this.DataFieldSelectType);
                else if (string.IsNullOrEmpty(this.DataFieldInputType))
                    throw new NoNullAllowedException(this.DataFieldInputType);
                else if (string.IsNullOrEmpty(this.DataFieldRequire))
                    throw new NoNullAllowedException(this.DataFieldRequire);
                else if (string.IsNullOrEmpty(this.DataFieldTopicId))
                    throw new NoNullAllowedException(this.DataFieldTopicId);


                if (value == null)               
                    this.dtlSurvey.DataSource = null;
                else
                {
                    List<HR_TopicDTO> lstTopic = this.GetTopics(value);
                    for (int i = 0; i < lstTopic.Count; i++)
                    {
                        HR_TopicDTO rtTopic = this.ParseQuestions(value, lstTopic[i]);
                        lstTopic[i] = rtTopic;
                    }
                    this.dtlSurvey.DataSource = lstTopic;
                }
            }
        }

        /// <summary>
        /// Danh sách câu hỏi kèm theo câu trả lời của enduser
        /// </summary>
        /// <returns></returns>
        public List<HR_QuestionDTO> GetOutputQuestions() {
            List<HR_QuestionDTO> lstQuestion = new List<HR_QuestionDTO>();
            foreach( DataListItem item in this.dtlSurvey.Items){
                HR_ctrQuestions ctrQuestion = (HR_ctrQuestions)item.FindControl("ctrQuestions");
                lstQuestion.AddRange(ctrQuestion.SelectQuestions);
                lstQuestion.AddRange(ctrQuestion.TableQuestions);
               
                
            }
            return lstQuestion;
        }
        /// <summary>
        /// Danh sách câu hỏi kèm theo câu trả lời dạng nhập của enduser
        /// </summary>
        /// <returns></returns>
        public List<HR_QuestionDTO> GetOutputInputQuestions()
        {
            List<HR_QuestionDTO> lstQuestion = new List<HR_QuestionDTO>();
            foreach (DataListItem item in this.dtlSurvey.Items)
            {
                HR_ctrQuestions ctrQuestion = (HR_ctrQuestions)item.FindControl("ctrQuestions");
                lstQuestion.AddRange(ctrQuestion.SelectQuestions);



            }
            return lstQuestion;
        }
        public override void DataBind()
        {
            this.dtlSurvey.DataBind();
            //base.DataBind();
        }

        /// <summary>
        /// Phân loại câu hỏi: Dạng table và dạng chọn (radio, combo, checkbox)
        /// </summary>
        /// <param name="value"></param>
        /// <param name="topic"></param>
        /// <returns></returns>
        protected HR_TopicDTO ParseQuestions(DataTable value, HR_TopicDTO topic)
        {
            try
            {

                List<HR_QuestionDTO> lstOtherQuestion = new List<HR_QuestionDTO>();
                List<HR_QuestionDTO> lstTableQuestion = new List<HR_QuestionDTO>();
    
                if (value == null) return topic;
                //Lặp lấy danh sách câu hỏi
                for (int i = 0; i < value.Rows.Count; i++)
                {
                    DataRow dr = value.Rows[i];
                    long lParentId = 0, lTopicId=0;
                    long.TryParse(dr[this.DataFieldParentID].ToString(), out lParentId);
                    long.TryParse(dr[this.DataFieldTopicId].ToString(), out lTopicId);
                    //Parent==null --> đó là câu hỏi
                    //Chỉ lấy các cau hỏi trong chủ đề
                    if (lParentId <= 0 && lTopicId == topic.TopicId)
                    {
                        HR_QuestionDTO questDTO = new HR_QuestionDTO();
                        questDTO.QuestionID = Convert.ToInt64(dr[this.DataFieldQuestionId]);
                        questDTO.QuestionName = dr[this.DataFieldText].ToString();
                        questDTO.TopicName = dr[this.DataFieldTopicName].ToString();
                        if (dr[this.DataFieldRequire] != DBNull.Value)
                            questDTO.IsRequire = Convert.ToBoolean(dr[this.DataFieldRequire]);
                        QuestionsSelectType selectType = QuestionsSelectType.None;
                        Enum.TryParse<QuestionsSelectType>(dr[this.DataFieldSelectType].ToString(), out selectType);
                        questDTO.SelectType = selectType;

                        QuestionsInputType inputType = QuestionsInputType.None;
                        Enum.TryParse<QuestionsInputType>(dr[this.DataFieldInputType].ToString(), out inputType);
                        questDTO.InputType = inputType;

                        //Nếu có câu trả lời dạng input
                        if (string.IsNullOrEmpty(this.DataFieldComment) == false)
                            questDTO.Comment = dr[this.DataFieldComment].ToString();
                        //Nếu có danh sách câu trả lời dạng chuỗi
                        string sStringAnswer = string.Empty;
                        if (string.IsNullOrEmpty(this.DataFieldAnswers) == false)
                            sStringAnswer = dr[this.DataFieldAnswers].ToString();
                        //Nếu là dạng table thì câu trả lời chính là Marks
                        if (questDTO.SelectType == QuestionsSelectType.Table)
                            questDTO.Marks = sStringAnswer;

                        questDTO.Answers = this.GetAnswers(value, questDTO, sStringAnswer); 
                        
                        //Nếu là dạng table 
                        if (questDTO.SelectType == QuestionsSelectType.Table)
                            lstTableQuestion.Add(questDTO);
                        else
                             lstOtherQuestion.Add(questDTO);
                            
                    }
                }
                topic.TableQuestion = lstTableQuestion;
                topic.OtherQuestion = lstOtherQuestion;
            
                return topic;
            }
            catch (Exception ex)
            {
                AlertMessage message = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(message);
            }
            return topic;
        }

        /// <summary>
        /// Danh sách câu trả lời theo câu hỏi
        /// </summary>
        /// <param name="value"></param>
        /// <param name="questDTO"></param>
        /// <returns></returns>
        private List<HR_AnswerDTO> GetAnswers(DataTable value, HR_QuestionDTO questDTO, string sStringAnswer)
        {
            
            List<HR_AnswerDTO> lstAnswers = new List<HR_AnswerDTO>();
            //Nếu là câu hỏi dạng table thì không cần lấy danh sách câu trả lời
            if (questDTO.SelectType != QuestionsSelectType.Table)
            {
                //Lấy danh sách câu trả lời
                for (int j = 0; j < value.Rows.Count; j++)
                {
                    DataRow drChild = value.Rows[j];
                    //Mã câu hỏi
                    long lChildParentId = 0;
                    long.TryParse(drChild[this.DataFieldParentID].ToString(), out lChildParentId);
                    //Tìm câu trả lời của câu hỏi hiện tại
                    if (lChildParentId == questDTO.QuestionID)
                    {
                        long lAnswerId = long.Parse(drChild[this.DataFieldAnswerId].ToString());
                        if (lAnswerId > 0)
                        {
                            bool bSelected = false;
                            if (string.Format(",{0},", sStringAnswer).Contains(string.Format(",{0},", lAnswerId)))
                                bSelected = true;
                            HR_AnswerDTO ansDTO = new HR_AnswerDTO(lAnswerId, drChild[this.DataFieldText].ToString(), questDTO.QuestionID, bSelected);
                            lstAnswers.Add(ansDTO);
                        }
                        
                    }
                }
            }
            return lstAnswers;
        }

        //Group theo topic
        protected List<HR_TopicDTO> GetTopics(DataTable dt)
        {
            if (dt == null) return null;
            var topics =  (from topic in dt.AsEnumerable()
                            select new { 
                                TopicId = topic.Field<long>(this.DataFieldTopicId),
                                TopicName=topic.Field<string>(this.DataFieldTopicName)
                            }).Distinct();
            List<HR_TopicDTO> lstTopic = new List<HR_TopicDTO>();
            foreach (var topic in topics)
            {
                HR_TopicDTO dto = new HR_TopicDTO();
                dto.TopicName = topic.TopicName;
                dto.TopicId = topic.TopicId;
                lstTopic.Add(dto);
            }
            return lstTopic;
        }

        protected void dtlSurvey_OnItemCommand(object sender, DataListItemEventArgs e)
        {
            try
            {
                if (e.Item.ItemType != ListItemType.Header
                    && e.Item.ItemType != ListItemType.Footer
                    && e.Item.ItemType != ListItemType.Pager
                )
                {
                    HR_TopicDTO objTopic = (HR_TopicDTO)e.Item.DataItem;
                    HR_ctrQuestions ctrQuestion = (HR_ctrQuestions)e.Item.FindControl("ctrQuestions");
                    ctrQuestion.ValidationGroup = this.ValidationGroup;
                    ctrQuestion.SelectQuestions = objTopic.OtherQuestion;
                    ctrQuestion.TableQuestions = objTopic.TableQuestion;                   
                    ctrQuestion.DataBind();

                }
            }
            catch (Exception ex)
            {
                AlertMessage message = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(message);
            }
        }

        public void Export() {
            Response.Clear();
            Response.Buffer = true;
            Response.ContentType = "application/vnd.ms-excel";
            Response.Charset = "";
            this.EnableViewState = false;
            System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
            System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
            
            this.dtlSurvey.RenderControl(oHtmlTextWriter);
            Response.Write(oStringWriter.ToString());
            Response.Flush();
            Response.End();
          
        }

        /// <summary>
        /// =True: Chỉ cho xem, không cho phép chỉnh sửa
        /// </summary>
        public bool ReadOnly
        {
            get {

                return (this.dtlSurvey.Enabled==false);
            }
            set {
                //Nếu ReadOnly=true
                if (value)
                {
                    this.dtlSurvey.Enabled = false;
                    this.dtlSurvey.CssClass = "divSurveyReadOnly";
                }
                else {
                    this.dtlSurvey.Enabled = true;
                    this.dtlSurvey.CssClass = ""; 
                }
            }
        }
    }
}